#INCLUDE foxtxn.h
DEFINE CLASS order AS session OLEPUBLIC
oMTX = .F.
oContext = .F.
PROCEDURE CustOrderWeb(lcCustID, lcProd, lnQty)
LOCAL nErr, lnTotal, cErr
DIMENSION aProdArr[1,2]
aProdArr[1] = lcProd
aProdArr[2] = VAL(lnQty)
lnTotal = 10*VAL(lnQty)
nBalance = 0
nTimeout = 0
nErr=THIS.ProcessOrder(lcCustID, lnTotal, @nBalance, @aProdArr, nTimeout)
CLOSE DATABASES ALL
THIS.oContext = null
THIS.oMTX = null
DO CASE
CASE m.nErr = S_OK
cErr = TRANSGOOD_LOC
CASE m.nErr = LIMIT_EXCEEDED
cErr = TRANSFAIL1_LOC
CASE m.nErr = ITEM_EXCEEDED
cErr = TRANSFAIL2_LOC
CASE m.nErr = CUST_NOT_FOUND
cErr = TRANSFAIL4_LOC
CASE m.nErr = ITEM_NOT_FOUND
cErr = TRANSFAIL5_LOC
OTHERWISE
cErr = TRANSFAIL3_LOC
ENDCASE
RETURN "
" + cErr + "
"
ENDPROC
PROCEDURE CustOrder(cCustID, nTotal, nBalance, aProdArr, nTimeout)
LOCAL nErr
nErr=THIS.ProcessOrder(cCustID, nTotal, @nBalance, @aProdArr, nTimeout)
CLOSE DATABASES ALL
THIS.oContext = null
THIS.oMTX = null
RETURN nErr
ENDPROC
PROCEDURE ProcessOrder(cCustID, nTotal, nBalance, aProdArr, nTimeout)
LOCAL oProd,oCust,i,nErrCode,lDataNotOpened,oMSMQ
THIS.oMTX = CREATEOBJECT(MTX_CLASS)
THIS.oContext = THIS.oMTX.GetObjectContext()
lDataNotOpened = EMPTY(DBC()) OR DBC()#DBCFILE
IF m.lDataNotOpened
OPEN DATABASE DBCFILE SHARED
ENDIF
*** Transaction 1: Send MSMQ Message
oMSMQ = THIS.oContext.CreateInstance(MSMQ_CLASS)
oMSMQ.nTimeout = nTimeout
oMSMQ.SendMsg(cCustID, nTotal, @aProdArr)
*** Transaction 2: Check for valid customer and account > 5000
oCust = THIS.oContext.CreateInstance(CUST_CLASS)
nErrCode = oCust.CheckCust(cCustID,nTotal,@nBalance)
nErrCode = IIF(TYPE("m.nErrCode")#"N",CONTEXT_E_ABORTED,m.nErrCode)
* Customer object aborted transaction
IF m.nErrCode#S_OK
THIS.oContext.SetAbort
RETURN m.nErrCode
ENDIF
*** Transaction 3: Check for product and valid amount
oProd = THIS.oContext.CreateInstance(PROD_CLASS)
FOR i = 1 TO ALEN(aProdArr,1)
nErrCode = oProd.checkstock(aProdArr[m.i,1],aProdArr[m.i,2])
nErrCode = IIF(TYPE("m.nErrCode")#"N",CONTEXT_E_ABORTED,m.nErrCode)
* Product object aborted transaction
IF m.nErrCode # S_OK
EXIT
ENDIF
ENDFOR
IF m.nErrCode = S_OK
THIS.oContext.SetComplete
ELSE
THIS.oContext.SetAbort
ENDIF
RETURN m.nErrCode
ENDPROC
PROCEDURE error(nError, cMethod, nLine)
STRTOFILE("Error in Order: "+TRANS(nError)+","+TRANS(nLine)+CRLF,ERRLOGFILE,.T.)
STRTOFILE(" "+MESSAGE()+CRLF,ERRLOGFILE,.T.)
RETURN CONTEXT_E_ABORTED
ENDPROC
ENDDEFINE